#ifndef CUATERNA_H_INCLUDED
#define CUATERNA_H_INCLUDED

template<class T,class U,class W,class Y>
class cuaterna{
    public:
    T first;
    U second;
    W third;
    Y fourth;
	cuaterna();
    cuaterna(const cuaterna<T,U,W,Y>& t);
    cuaterna(const T& prim, const U& seg, const W& ter, const Y& cuar);
    void mostrar(ostream& os) const;
    bool operator==(const cuaterna<T,U,W,Y>& t) const;
    ostream & operator<<(ostream &os) const;
};

template<class T,class U,class W,class Y>
ostream& operator<<(ostream& out, const cuaterna<T,U,W,Y>& t){
	t.mostrar(out);
	return out;
}

template<class T,class U,class W,class Y>
cuaterna<T,U,W,Y>::cuaterna(){
}

template<class T,class U,class W,class Y>
cuaterna<T,U,W,Y>::cuaterna(const T& prim, const U& seg, const W& ter, const Y& cuar) : first(prim),second(seg),third(ter), fourth(cuar){
}

template<class T,class U,class W,class Y>
void cuaterna<T,U,W,Y>::mostrar(ostream& os) const{
    os << "< " << first << ", " << second << ", " << third << ", " << fourth << " >";
}


template<class T,class U,class W,class Y>
cuaterna<T,U,W,Y>::cuaterna(const cuaterna<T,U,W,Y>& t):
  first(t.first),
  second(t.second),
  third(t.third),
  fourth(t.fourth){}


template<class T,class U,class W,class Y>
bool cuaterna<T,U,W,Y>::operator==(const cuaterna<T,U,W,Y>& t) const{

    bool igual;

    igual= ((first ==t.first) && (second == t.second) && (third == t.third) && (fourth == t.fourth));


    return igual;
}


template<class T,class U,class W,class Y>
ostream& cuaterna<T,U,W,Y>::operator<<(ostream &os) const{
    this.mostrar(os);
    return os;
}


#endif // CUATERNA_H_INCLUDED
